// 设置token权限
/**
 * 有无token-》有token-》是否进入登录页-》是-》跳转到主页
 * 有token-》是否跳转到登录页面-》否-》放行
 * 无token-》是否在白名单-》是-》放行
 * 没有在白名单-》显示登录页
 * */
// 引入路由实例
import router from '@/router'
// 引入vuex store实例
import store from '@/store'
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式
// 定义白名单 所有不受限制的页面 这里面的页面都是根据路由里面的写的
const whiteList = ['/login', '/404']
// 路由的前置守卫 到哪里去呀 冲哪里来 next（）放行 next（false）不放行 next（/）跳转到那个页面上
router.beforeEach(async(to, from, next) => {
  // 开启进度条
  NProgress.start() // 开启进度条
  if (store.getters.token) {
    // 有token
    if (to.path === '/login') {
      // 是去登录页面 让其去主页
      next('/')
    } else {
      // 不是去登录页面放行
      // 权限这里要必须有token并且还不是去登录页面的
      if (!store.getters.userId) {
        // 如果没有这个用户资料获取资料放行
        // 用async的函数再其他页面可以用await拿到返回值 roles里面有menus的值
        const { roles } = await store.dispatch('user/getUserInfo')
        // console.log(roles.menus)
        // 请求完用户资料将menus给到定义的action方法中修改数据 改完返回来
        const routes = await store.dispatch('permission/filterRoutes', roles.menus)
        // 将返回的值添加进router中的方法addroutes 这一步也相当于铺路
        router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }])
        // 添加完之后不能立刻进去要进行铺路等路铺好在进入 这个也相当于addRoutes已知的缺陷
        next(to.path)
      }
      next()
    }
  } else {
    if (whiteList.indexOf(to.path) > -1) {
      // 在白名单里放行
      next()
    } else {
      // 不在白名单里跳转到登录页面
      next('/login')
    }
  }
  //   手动关闭一次为了解决手动切换地址时进度条不关闭的的问题
  NProgress.done()
})
router.afterEach(function() {
  NProgress.done()// 关闭进度条
})
